import { MgrDef } from "./const/ModelConst";
import EntityMgr from "./manager/EntityMgr";
import RenderMgr from "./manager/RenderMgr";
import SceneMgr from "./manager/SceneMgr";
import ModelServer from "./server/ModelServer";

export default class MD {

    /** 主场景的根容器 */
    static container: HTMLElement;
    /** 模块管理 */
    static mgr: Array<IMgr>;
    
    static SC:ISceneServer = new ModelServer();

    /** 初始化 */
    static __init__(): void {

        MD.Log('BM init.');

        // 初始化管理器
        MD.mgr = new Array<IMgr>(MgrDef.MGR_SIZE);
        MD.initMgr();

        // 启动
        MD.startUp();
    }

    /** 初始化组件 */
    static initMgr(): void {

        MD.Log("init plugin");

        // 实体管理器
        MD.mgr[MgrDef.ENTITY_MGR] = new EntityMgr();
        // 场景管理器
        MD.mgr[MgrDef.SCENE_MGR] = new SceneMgr();
        // 渲染管理器
        MD.mgr[MgrDef.WEBGL_RENDER_MGR] = new RenderMgr();
    }

    /** 启动管理器 */
    static startUp(): void {

        for (let i = 0; i < MD.mgr.length; ++i) {
            MD.mgr[i].startUp();
        }
        // 启动帧循环
        MD.startRenderLoop();
    }

    static Log(message?: any, ...optionalParams: any[]): void {
        console.log(message, optionalParams);
    }

    /** 渲染循环 */
    static startRenderLoop(): void {
        // 渲染
        (MD.mgr[MgrDef.WEBGL_RENDER_MGR] as RenderMgr).render();
        // 动画帧
        requestAnimationFrame(() => this.startRenderLoop());
    }
}